package com.general.framework.cc.lock;

/**
 * 锁的可重入
 */
public class T9 {
    private int num = 0;
    // 方法上的 synchronized 锁的是this对象
    public synchronized void t1(){
        num++;
        System.out.println("now in t1==="+Thread.currentThread().getName());
        // 所以这里可以直接调用t2方法，因为t2也是synchronized修饰的，锁的是this对象
        t2();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    // 代码块上的 synchronized 锁的是this对象
    public synchronized void t2(){
        num++;
        System.out.println("now in t2==="+Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        T9 t9 = new T9();
        new Thread(t9::t1).start();
        new Thread(t9::t1).start();

        // 自旋锁
        while (t9.num < 4){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        System.out.println("main thread is over");
    }
}
